<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';

/**
 * Controller para ações de Mídia(CD, DVD)
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Midia extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();
        
        //carrega a class nescessárias
        $this->load->model(array('DAOMidia', 'DAOEmprestimo'));
        $this->load->helper('text');

        //Seta propriedades do template
        $arr_js = $this->config->item('js');
        array_push($arr_js, 'jquery.lightbox-0.5');
        $this->template->load_js($arr_js);
        $this->template->set('title', 'Gerenciamento de Mídia || ' . $this->title);
        $this->template->set('page_title', 'Gerenciamento de Mídia (DVD, CD...)');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Passe o cursor do mouse sobre a capa do item e veja algumas informações, como o status para empréstimo.</p>
                        <p><span class="bold">Só é possível excluir uma MÍDIA se ela não estiver relacionada com nenhum empréstimo.</span></p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar uma nova Mídia.</p>');
    }

    public function index() {
        $this->listar();
    }

    /**
     * Carrega a view com a lista de mídias
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_MIDIA);
            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');
            
            $init = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
            
            $total_pagina = $this->uri->segment(3) ? $this->uri->segment(3) : 30;
            $midia = $this->DAOMidia->select_all_media($init, $total_pagina);
            $total_rows = $this->DAOMidia->amount_all_medias();

            // paginação
            $config['uri_segment'] = 4;
            $config['base_url'] = base_url() . "midia/listar/" . $total_pagina;
            $config['total_rows'] = $total_rows;
            $config['per_page'] = $total_pagina;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['quant_list'] = $total_pagina;
            $data['pagination'] = $this->pagination->create_links();
            $data['itens'] = $midia;

            $this->template->load(NULL  , 'midia_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Retorna via json a mídia selecionada
     * 
     * @param int $codigo_item Código do item a ser selecionado
     */
    public function get_media($codigo_item = NULL) {
        try {
            $this->load->library('table');

            /**
             * Se $codigo_item for NULL, indica que a validação do codigo do item deve ser feita.
             *  - Note que o código vem como POST
             * Se for diferente de NULL, indica que já foi feita  epor isso não é preciso fazer novamente
             *  - Note que o código vem do parametro da função
             */
            if ($codigo_item != NULL) {
                $codigo = $codigo_item;
            } else {
                $this->load->library('form_validation');
                $this->form_validation->set_rules("codigo_item", "Código", "trim|required|min_length[6]|max_length[6]|xss_clean");
                $codigo = $this->input->post('codigo_item', TRUE);
            }
            
            if ($codigo_item == NULL && $this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $item = new TOItem();
                $item->codigo = $codigo;
                $data['item'] = $this->DAOMidia->get_media_json($item);
                
                /** 
                 * Preparando dados para a view 
                 */
                foreach ($data as $item) {
                    //Formatando Dados
                    foreach ($item->emprestimos as $emprestimo) {
                        //Criando linha da tabela
                        $this->table->add_row(
                                $emprestimo->id, 
                                format_date($emprestimo->data_saida, TRUE), 
                                format_date($emprestimo->data_retorno, FALSE), 
                                $emprestimo->usuario->nome . ' ' . $emprestimo->usuario->sobrenome, 
                                $emprestimo->usuario_admin->nome, 
                                $emprestimo->emprestimo_item->total, 
                                $emprestimo->emprestimo_item->get_nome_status(),
                                '<a title="Visualizar/Editar registro deste empréstimo" href="'. site_url('emprestimo/atualizar/' . $emprestimo->id) . '"><img align="center" src="' . site_url('assets/img/edit.png') . '"/></a>'
                        );
                    }
                    $item->data_cadastro = format_date($item->data_cadastro, TRUE);
                }
                $this->table->set_caption('<h3>Histórico dos últimos 05 empréstimos | ' . anchor('emprestimo/buscar/data_saida/2/10?search_term=' . $item->titulo, '<i>Visualizar histórico completo do item >></i>') . '</h3>');
                $this->table->set_heading('Código', 'Data da saída', 'Data do retorno', 'Usuário', 'Adminitrador', 'Total', 'Status', 'Ação');
                $data['enquiries_table'] = $this->table->generate();
                $data['categorias'] = $item->to_string_categories(TRUE);
                $data['check_availability_item'] = $this->DAOEmprestimo->check_availability_item($item, NULL);
                $data['total_loan'] = string_fill($this->DAOEmprestimo->amount_all_loan_item($item->codigo), 4, 0);
                
                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Abre formulário para cadastrar mídia
     */
    public function cadastrar() {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_MIDIA);

            //Carregando js necessários
            $arr_js = $this->config->item('js');
            array_push($arr_js, 'jquery.alphanumeric.pack');
            array_push($arr_js, '../plugins/ckeditor/ckeditor');
            $this->template->load_js($arr_js);
            $this->load->model('DAOCategoria');
            $data['categorias'] = $this->DAOCategoria->select_all_categories(0, NULL, 'nome', 'ASC', FALSE);

            $this->template->set('title', 'Cadastrar Mídia (DVD, CD...) || ' . $this->title);
            $this->template->set('page_title', 'Cadastro de Mídia (DVD, CD...)');
            $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Não é permitido cadastro duplicado de <span class="bold">Mídias (DVD, CD...)</span>, então verifique se o item a ser inserido não possui cadastro.</p>
                        <p>Os campos sinalizados com <span class="bold">*</span> são obrigatórios o preenchimento.</p>
                        <p>O item poderá ser <span class="bold">cadastrado com mais de uma categoria</span>, basta selecionar as que desejar segurando a tecla <span class="bold">Ctrl.</span></p>
                        <p class="bold"><span class="bold">ALT + N</span> Abre o formulário para cadastrar uma nova Mídia.</p>');

            $this->template->load(NULL, 'midia_form', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    /**
     * Confirma o cadastro de mídia validadando os dados
     * 
     * @throws ExceptionValidacao
     */
    public function confirma_cadastrar() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("categoria_id", "Categoria(s)", "trim|required|min_length[1]|xss_clean");
            $this->form_validation->set_rules("titulo", "Título", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("subtitulo", "Subtítulo", "trim|min_length[2]|xss_clean");
            $this->form_validation->set_rules("ano", "Ano de Publicação", "trim|required|min_length[4]|max_length[4]|integer|xss_clean");
            $this->form_validation->set_rules("idioma", "Idioma", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("localizacao", "Localização", "trim|min_length[2]|xss_clean");
            $this->form_validation->set_rules("fakeImagem", "Imagem", "trim|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|min_length[20]|xss_clean");
            $total_estoque = $this->input->post('total_estoque', TRUE);
            $this->form_validation->set_rules("total_estoque", "Quantidade em estoque", "trim|required|min_length[1]|is_natural_no_zero|xss_clean");
            $this->form_validation->set_rules("total_emprestimo", "Quantidadte para empréstimo", "trim|required|min_length[1]|is_natural_no_zero|xss_clean|second_lower_first[$total_estoque]");
            $this->form_validation->set_rules("status", "Status", "trim|required|min_length[1]|max_length[1]|integer|xss_clean");
            $this->input->post('status', TRUE) == TOItem::ITEM_INATIVO ? $this->form_validation->set_rules("motivo_inatividade", "Motivo", "trim|required|min_length[5]|max_length[245]|xss_clean")  : '';

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                // Montando objeto item      
                $item = new TOItem();
                $item->midia = new TOMidia();
                
                //Relacionados
                $categorias = explode(',', $this->input->post('categoria_id', TRUE));
                $item->categorias = array();
                foreach ($categorias as $value) {
                    $categoria_item = new TOCategoria();
                    $categoria_item->id = $value;
                    $item->categorias[] = $categoria_item;
                }
                
                //Informações gerais
                $item->titulo = $this->input->post('titulo', TRUE);
                $item->subtitulo = $this->input->post('subtitulo', TRUE);
                $item->midia->ano = $this->input->post('ano', TRUE);
                $item->idioma = $this->input->post('idioma', TRUE);
                $item->localizacao = $this->input->post('localizacao', TRUE);
                $item->descricao = $this->input->post('descricao', TRUE);
                $item->tipo = new TOTipo();
                $item->tipo->id = TOItem::TIPO_MIDIA;
                $item->data_cadastro = date('Y-m-d H:i:s');
                
                //Dados Empréstimo
                $item->movimentacao = new TOMovimentacao();
                $item->movimentacao->total_estoque = $this->input->post('total_estoque', TRUE);
                $item->movimentacao->total_manipulacao = $this->input->post('total_emprestimo', TRUE);
                $item->movimentacao->total_disponivel = $this->input->post('total_emprestimo', TRUE);
                $item->movimentacao->status = $this->input->post('status', TRUE);
                $item->movimentacao->status == TOItem::ITEM_INATIVO ? $item->movimentacao->motivo_inatividade = $this->input->post('motivo_inatividade', TRUE) : $item->movimentacao->motivo_inatividade = NULL;
                
                //Usuário
                $item->admin = new TOUsuario();
                $item->admin->id = $this->get_user_logged();
                
                /**
                 * Faz upload da imagem caso ela exista
                 */
                $imagem = $this->input->post('fakeImagem', TRUE);
                if (!empty($imagem)) {
                    $this->load->model('UploadImage'); // carrega o Model que contem o método para upload
                    
                    $limit_name = crop_string($item->titulo, 25, TRUE); // Limita o tamanho do nome em 25 caracteres
                    $img_name = remove_accents($limit_name); // remove acentos e caracteres especiais

                    $data_img = $this->UploadImage->do_upload($this->config->item('path_img_item') . 'media/', $img_name);
                   
                    // Se o Upload foi feito com sucesso
                    !empty($data_img) ? $item->imagem = $data_img['file_name'] : '';
                }else{
                    //Caso não foi selecionado imagem é salvo a imagem padrão
                    $item->imagem = $this->config->item('img_upload_default');
                }
                
                //SE TUDO FOI OK ATÉ AQUI >> Insere o item
                $this->DAOMidia->insert_media($item);

                Mensagem::setMensagemSucesso("Mídia:<span class='bold'> " . $item->titulo . " </span>cadastrada com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->cadastrar();
        }
    }

    
    /**
     * Atualiza dados da mídia
     * 
     * @throws ExceptionValidacao
     */
    public function atualizar($codigo_item) {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_MAGAZINE);

            $this->load->model('DAOItem');
            $check_item = $this->DAOItem->check_item($codigo_item);

            // Verificação se o item selecionado é válido para a edição
            if ($codigo_item == NULL || $check_item != TRUE) {
                throw new Exception('Não foi possível selecionar o item para edição dos registros. Tente novamente!');
            } else {
                $this->template->set('title', 'Atualizar Mídia (DVD, CD...) || ' . $this->title);
                $this->template->set('page_title', 'Atualização de Mídia (DVD, CD...)');
                $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                            <p>Os campos sinalizados com <span class="bold">*</span> são obrigatórios o preenchimento.</p>
                            <p>O item poderá ser <span class="bold">cadastrado com mais de uma categoria</span>, basta selecionar as que desejar segurando a tecla <span class="bold">Ctrl.</span></p>');
                
                //Carregando js necessários
                $arr_js = $this->config->item('js');
                array_push($arr_js, 'jquery.alphanumeric.pack');
                array_push($arr_js, '../plugins/ckeditor/ckeditor');
                array_push($arr_js, 'jquery.lightbox-0.5');
                $this->template->load_js($arr_js);

                /** Pegando os dados necessários para a view **/
                
                //Pega o item selecionado de acordo com o codigo
                $item = new TOItem();
                $item->codigo = $codigo_item;
                $data['item'] = $this->DAOMidia->get_media($item);
                
                //Pega todas as categorias cadastradas                          
                $this->load->model('DAOCategoria');
                $data['categorias'] = $this->DAOCategoria->select_all_categories(0, NULL, 'nome', 'ASC', FALSE);

                //Peega os ids das categorias do item e tranformando em string separadas por virgula
                $categorias_id = array();
                foreach ($data['item']->categorias as $categoria) {
                     array_push($categorias_id, $categoria->id);
                }
                $data['categorias_id'] = implode(',', $categorias_id); // Separa por virgula os ids para enviar para view
                
                $this->template->load(NULL, 'midia_edit', $data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    
    /**
     * Confirma a atualizacao de mídia
     * 
     * @throws ExceptionValidacao
     */
    public function confirma_atualizar() {
        try {
            $codigo_item = $this->input->post('codigo', TRUE);
            
            $this->load->library('form_validation');
            $this->form_validation->set_rules("categoria_id", "Categoria(s)", "trim|required|min_length[1]|xss_clean");
            $this->form_validation->set_rules("titulo", "Título", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("subtitulo", "Subtítulo", "trim|min_length[2]|xss_clean");
            $this->form_validation->set_rules("ano", "Ano de Publicação", "trim|required|min_length[4]|max_length[4]|integer|xss_clean");
            $this->form_validation->set_rules("idioma", "Idioma", "trim|required|min_length[2]|xss_clean");
            $this->form_validation->set_rules("localizacao", "Localização", "trim|min_length[2]|xss_clean");
            $this->form_validation->set_rules("fakeImagem", "Imagem", "trim|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|min_length[20]|xss_clean");
            $total_estoque = $this->input->post('total_estoque', TRUE);
            $this->form_validation->set_rules("total_estoque", "Quantidade em estoque", "trim|required|min_length[1]|is_natural_no_zero|xss_clean");
            $this->form_validation->set_rules("total_emprestimo", "Quantidadte para empréstimo", "trim|required|min_length[1]|is_natural_no_zero|xss_clean|second_lower_first[$total_estoque]");
            $this->form_validation->set_rules("status", "Status", "trim|required|min_length[1]|max_length[1]|integer|xss_clean");
            $this->input->post('status', TRUE) == TOItem::ITEM_INATIVO ? $this->form_validation->set_rules("motivo_inatividade", "Motivo", "trim|required|min_length[5]|max_length[245]|xss_clean")  : '';

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                // Montando objeto item      
                $item = new TOItem();
                $item->codigo = $codigo_item;
                $item->midia = new TOMidia();
                
                //Relacionados
                $categorias = explode(',', $this->input->post('categoria_id', TRUE));
                $item->categorias = array();
                foreach ($categorias as $value) {
                    $categoria_item = new TOCategoria();
                    $categoria_item->id = $value;
                    $item->categorias[] = $categoria_item;
                }
                
                //Informações gerais
                $item->titulo = $this->input->post('titulo', TRUE);
                $item->subtitulo = $this->input->post('subtitulo', TRUE);
                $item->midia->ano = $this->input->post('ano', TRUE);
                $item->idioma = $this->input->post('idioma', TRUE);
                $item->localizacao = $this->input->post('localizacao', TRUE);
                $item->descricao = $this->input->post('descricao', TRUE);
                
                //Dados Empréstimo
                $item->movimentacao = new TOMovimentacao();
                $item->movimentacao->total_estoque = $this->input->post('total_estoque', TRUE);
                
                /**
                 * FAZER CHECAGEM do total para manipulação (treat_amount_manipulation) afim de não ibter erro com o tatal disponivel
                 * 1° Verifica se o novo total é maior que o total de empréstimo ATIVOS
                 * 2° Se passar na validação o total disponivel para empréstimos correto é retornado
                 * 3° Se não pssar é lançado uma exceção
                 */
                $this->load->model('DAOItem');
                $item->movimentacao->total_manipulacao = $this->input->post('total_emprestimo', TRUE);
                $item->movimentacao->total_disponivel  = $this->DAOItem->treat_amount_manipulation($codigo_item, $item->movimentacao->total_manipulacao);
                $item->movimentacao->status = $this->input->post('status', TRUE);
                $item->movimentacao->status == TOItem::ITEM_INATIVO ? $item->movimentacao->motivo_inatividade = $this->input->post('motivo_inatividade', TRUE) : $item->movimentacao->motivo_inatividade = NULL;
                
                /**
                 * Faz upload da imagem caso ela exista
                 */
                $imagem = $this->input->post('fakeImagem', TRUE);
                $imagem_original = $this->input->post('imagem_original', TRUE);
                $this->load->model('UploadImage'); // carrega o Model que contem o método para upload
                if (!empty($imagem) && $imagem != $imagem_original) {
                    //APAGA as IMAGEM ANTIGA do diretorio
                    $this->UploadImage->delete_image($this->config->item('path_img_item') . 'media/', $imagem_original);
                    
                    $limit_name = crop_string($item->titulo, 25, TRUE); // Limita o tamanho do nome em 25 caracteres
                    $img_name = remove_accents($limit_name); // remove acentos e caracteres especiais

                    $data_img = $this->UploadImage->do_upload($this->config->item('path_img_item') . 'media/', $img_name);

                    // Se o Upload foi feito com sucesso
                    !empty($data_img) ? $item->imagem = $data_img['file_name'] : '';
                    
                } elseif ($imagem == NULL) {
                    //APAGA as IMAGEM ANTIGA do diretorio
                    $this->UploadImage->delete_image($this->config->item('path_img_item') . 'media/', $imagem_original);

                    //Caso seja solicitado atualizar sem imagem, é atualizado com a imagem padrão
                    $item->imagem = $this->config->item('img_upload_default');
                }

                //SE TUDO FOI ok ATÉ AQUI >> Insere o item
                $this->DAOMidia->update_media($item);

                Mensagem::setMensagemSucesso("Mídia:<span class='bold'> " . $item->titulo . " </span>atualizada com sucesso!");
                $this->index($codigo_item);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->atualizar($codigo_item);
        }
    }

    /**
     * Exclui mídia
     * 
     * @param bool $redirect Se TRUE redericiona para o index, se não... nada Faz depois da exclusão
     */
    public function excluir($redirect = TRUE) {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_MIDIA);
            
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");
            $this->form_validation->set_rules("nomeDelete", "Nome", "trim|min_length[5]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $item = new TOItem();
                $item->codigo = $this->input->post('codigoDelete', TRUE);
                $item->titulo = $this->input->post('nomeDelete', TRUE);
                $item->imagem = $this->input->post('imagemDelete', TRUE); // A imagem tambem é deletada caso exista
                
                $this->DAOMidia->delete_media($item);

                $item->titulo != NULL ? Mensagem::setMensagemSucesso("Mídia: <span class='bold'>" . $item->titulo . "</span> excluída com sucesso!") : Mensagem::setMensagemSucesso("Magazines  excluídas com sucesso!");

                $redirect ? $this->index() : '';
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    /**
     * Busca por mídia
     */
    public function buscar() {
        try {
            // Seta a variavel 'searchterm' na sessão
            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));

            $init = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;

            $total_pagina = $this->uri->segment(3) ? $this->uri->segment(3) : 30;
            $midia = $this->DAOMidia->search_media($init, $total_pagina, $searchterm);
            $total_rows = $this->DAOMidia->amount_search_media($searchterm);

            // paginação
            $config['uri_segment'] = 4;
            $config['base_url'] = base_url() . "midia/buscar/" . $total_pagina;
            $config['total_rows'] = $total_rows;
            $config['per_page'] = $total_pagina;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['quant_list'] = $total_pagina;
            $data['pagination'] = $this->pagination->create_links();
            $data['itens'] = $midia;

            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para essa pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            $this->template->load(NULL  , 'midia_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }
}
